# -*- coding: utf-8 -*-
#混合空间增强（综合平滑滤波器、锐化处理、灰度拉伸等对图像进行处理
#先对原始图像进行拉普拉斯锐化与原始图像相加，又对原始图像进行索贝尔梯度处理通过5*5均值滤波，
# 与锐化相加的图像相乘再与原图相加后进行幂律变换即可得到混合空间增强图像

from skimage import filters,data,exposure
from matplotlib import pyplot as plt
import numpy as np
#图像空间滤波函数
def correl2d(img,window):
    m=window.shape[0]
    n=window.shape[1]
    #边界通过0灰度值填充扩展
    img1=np.zeros((img.shape[0]+m-1,img.shape[1]+n-1))
    img1[(m-1)//2:(img.shape[0]+(m-1)//2),(n-1)//2:(img.shape[1]+(n-1)//2)]=img
    img2=np.zeros(img.shape)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            temp=img1[i:i+m,j:j+n]
            img2[i,j]=np.sum(np.multiply(temp,window))
    return img2
#img为原始图像
img=data.camera()#二维图像
#进行拉普拉斯变化，引用中心系数为正的拓展的拉普拉斯算子（拉普拉斯锐化）
window=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])#中心系数为正的拓展的拉普拉斯算子
img_laplace=correl2d(img,window)
img_laplace=255*(img_laplace-img_laplace.min())/(img_laplace.max()-img_laplace.min())
#将img和img_laplace相加得到锐化增强的图像img_laplace_enhance
img_laplace_enhance=img+img_laplace
#img_sobel为原始图像img进行sobel处理结果（索贝尔梯度处理）
img_sobel=filters.sobel(img)#索贝尔梯度处理
#使用5×5均值滤波器平滑后的sobel图像
window_mean=np.ones((5,5))/(5**2)
# windo_mean=np.ones((3*3)/(3**2))
# windo_mean=np.ones((9*9)/(9**2))
img_sobel_mean=correl2d(img_sobel,window_mean)
#将img_lapace_enhance与img_sobel_mean相乘得到锐化效果
img_mask=img_laplace_enhance*img_sobel_mean
#将原始图像img与锐化图像img_mask相加得到锐化增强图像
img_sharp_enhance=img+img_mask
#对img_sharp_enhance进行灰度幂律变换得到最终结果
img_enhance=img_sharp_enhance**0.5
#幂律变化即伽马变换，img_enhance=img_enhance1
img_enhance1=exposure.adjust_gamma(img_sharp_enhance,0.5)
#显示混合增强后的幂律变换图像
plt.figure()
plt.axis('off')
plt.imshow(img_enhance, cmap='gray')
#显示混合增强后的伽马变换图像
# plt.figure()
# plt.axis('off')
# plt.imshow(img_enhance1, cmap='gray')
#显示原图像
plt.figure()
plt.axis('off')
plt.imshow(img, cmap='gray')
#显示拉普拉斯变换结果
plt.figure()
plt.axis('off')
plt.imshow(img_laplace, cmap='gray')
#显示拉普拉斯变换与原图像相加增强效果
plt.figure()
plt.axis('off')
plt.imshow(img_laplace_enhance, cmap='gray')
#显示锐化增强结果
plt.figure()
plt.axis('off')
plt.imshow(img_mask, cmap='gray')

